﻿using System;
using System.Linq;
using System.Web.Security;
using System.Web.UI;
using ShoppingCart.Business.Logic;
using ShoppingCart.WebSite.Code;
using SC = ShoppingCart.Business.Entity;

namespace ShoppingCart.WebSite
{
    public partial class Registrar : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack) return;
            
            Step = "2";
            LoadDepartamentos();
            LoadCliente();
            txtNumeroDocumento.Focus();
        }

        protected void TxtNumeroDocumentoTextChanged(object sender, EventArgs e)
        {
            //var cliente = ddlTipoDocumento.SelectedIndex == 0
            //                  ? ClienteManager.Instancia.ObtenerPorDni(txtNumeroDocumento.Text)
            //                  : ClienteManager.Instancia.ObtenerPorRuc(txtNumeroDocumento.Text);
            var cliente = ClienteManager.Instancia.ObtenerPorDni(txtNumeroDocumento.Text);
            if (cliente == null) return;
            LoadCliente(cliente);
        }

        protected void DdlDepartamentoSelectedIndexChanged(object sender, EventArgs e)
        {
            LoadProvincias(Convert.ToInt32(ddlDepartamento.SelectedValue));
        }

        protected void DdlProvinciaSelectedIndexChanged(object sender, EventArgs e)
        {
            LoadDistritos(Convert.ToInt32(ddlProvincia.SelectedValue));
        }

        protected void BtnContinuarClick(object sender, EventArgs e)
        {
            if (User.IsInRole("Administrador")) Response.Redirect("Carrito.aspx", true);
            try
            {
                var username = txtNumeroDocumento.Text;
                var password = txtNumeroDocumento.Text;
                var email = txtEmail.Text;
                var clienteUser = Membership.GetUser(username);

                if (clienteUser == null)
                {
                    var user = Membership.CreateUser(username, password, email);
                    Roles.AddUserToRole(username, "Cliente");

                    var cliente = new SC.Cliente
                                      {
                                          UserID = (Guid)user.ProviderUserKey,
                                          Nombre = txtNombres.Text,
                                          Apellidos = txtApellidos.Text,
                                          Dni = txtNumeroDocumento.Text,
                                          Ruc = txtRuc.Text,
                                          RazonSocial = txtRazonSocial.Text,
                                          Email = email,
                                          Direccion = txtDireccion.Text,
                                          Foto = string.Empty,
                                          FechaNacimiento = DateTime.Now,
                                          Sexo = "M",
                                          Distrito = new SC.Distrito { IdDistrito = Convert.ToInt32(ddlDistrito.SelectedValue) }
                                      };
                    IdCliente = ClienteManager.Instancia.Agregar(cliente);
                }
                else
                {
                    var cliente = ClienteManager.Instancia.ObtenerPorGuid((Guid) clienteUser.ProviderUserKey);
                    if(cliente == null)
                    {
                        cliente = new SC.Cliente
                        {
                            UserID = (Guid)clienteUser.ProviderUserKey,
                            Nombre = txtNombres.Text,
                            Apellidos = txtApellidos.Text,
                            Dni = txtNumeroDocumento.Text,
                            Ruc = txtRuc.Text,
                            RazonSocial = txtRazonSocial.Text,
                            Email = email,
                            Direccion = txtDireccion.Text,
                            Foto = string.Empty,
                            Sexo = "M",
                            FechaNacimiento = DateTime.Now,
                            Distrito = new SC.Distrito { IdDistrito = Convert.ToInt32(ddlDistrito.SelectedValue) }
                        };
                        IdCliente = ClienteManager.Instancia.Agregar(cliente);
                    }
                    else
                    {
                        IdCliente = cliente.IdCliente;
                        cliente.Nombre = txtNombres.Text;
                        cliente.Apellidos = txtApellidos.Text;
                        cliente.RazonSocial = txtRazonSocial.Text;
                        cliente.Distrito.IdDistrito = Convert.ToInt32(ddlDistrito.SelectedValue);
                        cliente.Direccion = txtDireccion.Text;
                        ClienteManager.Instancia.Modificar(cliente);   
                    }
                }
                Response.Redirect("Carrito.aspx", true);
            }
            catch (Exception)
            {
                ClientScript.RegisterStartupScript(GetType(), "mostrar", "alert('El Registro no se pudo grabar, intente de nuevo o más tarde.');", true);
            }
        }

        private void LoadDepartamentos()
        {
            var departamentos = DepartamentoManager.Instancia.Listar(true);
            BindControl<SC.Departamento>.BindDropDownList(ddlDepartamento, departamentos);
            if (departamentos.Count == 0) return;
            LoadProvincias(departamentos.First().IdDepartamento);
        }

        private void LoadProvincias(int idDepartamento)
        {
            var provincias = ProvinciaManager.Instancia.ListarPorIdDepartamento(idDepartamento);
            BindControl<SC.Provincia>.BindDropDownList(ddlProvincia, provincias);
            if (provincias.Count == 0) return;
            LoadDistritos(provincias.First().IdProvincia);
        }

        private void LoadDistritos(int idProvincia)
        {
            var distritos = DistritoManager.Instancia.ListarPorIdProvincia(idProvincia);
            BindControl<SC.Distrito>.BindDropDownList(ddlDistrito, distritos);
        }

        private void LoadCliente()
        {
            if (IdCliente == 0) return;
            var cliente = ClienteManager.Instancia.Obtener(IdCliente);
            if (cliente == null) return;
            LoadCliente(cliente);
        }

        private void LoadCliente(SC.Cliente cliente)
        {
            //ddlTipoDocumento.SelectedIndex = 0;
            txtNumeroDocumento.Text = cliente.Dni;
            txtNombres.Text = cliente.Nombre;
            txtApellidos.Text = cliente.Apellidos;
            txtEmail.Text = cliente.Email;
            txtRuc.Text = cliente.Ruc;
            txtRazonSocial.Text = cliente.RazonSocial;
            var distrito = DistritoManager.Instancia.Obtener(cliente.Distrito.IdDistrito);
            var provincia = ProvinciaManager.Instancia.Obtener(distrito.Provincia.IdProvincia);
            LoadProvincias(provincia.Departamento.IdDepartamento);
            LoadDistritos(provincia.IdProvincia);

            ddlDepartamento.SelectedValue = provincia.Departamento.IdDepartamento.ToString();
            ddlProvincia.SelectedValue = provincia.IdProvincia.ToString();
            ddlDistrito.SelectedValue = cliente.Distrito.IdDistrito.ToString();
            txtDireccion.Text = cliente.Direccion;
            if (!string.IsNullOrEmpty(cliente.Foto))
                imgFoto.ImageUrl = cliente.Foto;
        }
    }
}
